﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SIIE_ERP.Codigo;

namespace SIIE_ERP.BaseDatos.Bancos.Transacciones
{
    public class dbo_Movimiento_Banco
    {
        #region Propiedades

        private string _RFC;
        private string _Usuario;

        #endregion
        
        #region Constructores

        public dbo_Movimiento_Banco(string RFC, string Usuario)
        {
            this._RFC = RFC;
            this._Usuario = Usuario;
        }

        #endregion

        #region SELECT

        public DataTable Get_Report(int Id_CuentaBancaria, int Id_TipoMov, int Tiempo)
        {
            string Query = @"

                SELECT

	                dbo_Trans_Movimiento_Bancario.RFC, 
	                dbo_Trans_Movimiento_Bancario.Secuencia, 
	                dbo_Trans_Movimiento_Bancario.Fecha_Movimiento_Bancario, 
	                dbo_Trans_Movimiento_Bancario.Id_Cuenta, 
	                dbo_Cat_Cuenta_Bancaria.Nombre AS Cuenta, 
	                dbo_Trans_Movimiento_Bancario.Id_TipoMov_Banco, 
                    ' ' AS Tipo_Movimiento_Clave, 
	                dbo_Cat_TipoMov_Banco.Nombre AS Tipo_Movimiento, 
	                dbo_Trans_Movimiento_Bancario.Concepto, 
	                dbo_Trans_Movimiento_Bancario.Referencia, 
	                dbo_Trans_Movimiento_Bancario.Id_Moneda, 
	                dbo_Cat_Moneda.Clave AS Moneda, 
	                dbo_Trans_Movimiento_Bancario.Importe, 
	                dbo_Trans_Movimiento_Bancario.Estatus, 
	                dbo_Cat_Estatus.Nombre AS Estatus_Desc

                FROM

                ((((    dbo_Trans_Movimiento_Bancario 
	                INNER JOIN dbo_Cat_Moneda ON dbo_Trans_Movimiento_Bancario.Id_Moneda = dbo_Cat_Moneda.Id_Moneda )
	                INNER JOIN dbo_Cat_Cuenta_Bancaria ON dbo_Trans_Movimiento_Bancario.Id_Cuenta = dbo_Cat_Cuenta_Bancaria.Id_Cuenta )
	                INNER JOIN dbo_Cat_TipoMov_Banco ON dbo_Trans_Movimiento_Bancario.Id_TipoMov_Banco = dbo_Cat_TipoMov_Banco.Id_TipoMov_Banco )
	                INNER JOIN dbo_Cat_Estatus ON dbo_Trans_Movimiento_Bancario.Estatus = dbo_Cat_Estatus.Estatus)


                WHERE 

                    dbo_Trans_Movimiento_Bancario.RFC = '@@RFC'
                AND (@@Id_CuentaBancaria = -1 OR dbo_Trans_Movimiento_Bancario.Id_Cuenta = @@Id_CuentaBancaria)
                AND (@@Id_TipoMov = -1 OR dbo_Trans_Movimiento_Bancario.Id_TipoMov_Banco = @@Id_TipoMov)
                
                AND 
				(
				(@@Tiempo = 1 and Year(dbo_Trans_Movimiento_Bancario.Fecha_Alta) = Year(NOW()) and Month(dbo_Trans_Movimiento_Bancario.Fecha_Alta) = Month(NOW())) or
				(@@Tiempo = 2 and Year(dbo_Trans_Movimiento_Bancario.Fecha_Alta) = Year(DateAdd('m',-1,NOW())) and Month(dbo_Trans_Movimiento_Bancario.Fecha_Alta) = Month(DateAdd('m',-1,NOW()))) or
				(@@Tiempo = 3 and Year(dbo_Trans_Movimiento_Bancario.Fecha_Alta) = Year(NOW())) or
				(@@Tiempo = 4 and Year(dbo_Trans_Movimiento_Bancario.Fecha_Alta) = Year(DateAdd('yyyy',-1,NOW()))) or
				(@@Tiempo = 5)
				) 

                ";
            Query = Query.Replace("@@RFC", this._RFC);
            Query = Query.Replace("@@Id_CuentaBancaria", Id_CuentaBancaria.ToString());
            Query = Query.Replace("@@Id_TipoMov", Id_TipoMov.ToString());
            Query = Query.Replace("@@Tiempo", Tiempo.ToString());

            return SrvDB.ExecuteQuery_Get(Query);
        }

        public DataTable Get_Movimientos()
        {
            string Query = @"SELECT A1.*,
                                    A2.Nombre as Desc_Cuenta,
                                    A3.Nombre as Desc_TipoMovimiento
                            FROM ((
                                dbo_Trans_Movimiento_Bancario as A1 
                                    INNER JOIN dbo_Cat_Cuenta_Bancaria as A2 ON A1.Id_Cuenta =A2.Id_Cuenta ) 
                                    INNER JOIN dbo_Cat_TipoMov_Banco as A3 ON A1.Id_TipoMov_Banco = A3.Id_TipoMov_Banco)
                            WHERE A1.RFC = '@@RFC' ORDER BY Fecha_Movimiento_Bancario DESC";
            Query = Query.Replace("@@RFC", this._RFC);

            return SrvDB.ExecuteQuery_Get(Query);
        }
        
        #endregion

        #region INSERT

        public Respuesta Insert_Movimiento_Bancos(
            DateTime Fecha,
            string IdCuenta,
            string TipoMovimiento,
            string Concepto,
            string Referencia,
            string IdMoneda,
            string Importe
        )
        {
            try
            {
                // TODO: Obtenemos la naturaleza del movimiento
                string q = @"SELECT Naturaleza FROM dbo_Cat_TipoMov_Banco WHERE Id_TipoMov_Banco = @@TipoMovBanco";
                q = q.Replace("@@TipoMovBanco", TipoMovimiento);
                string Naturaleza = SrvDB.ExecuteQuery_Get(q).Rows[0][0].ToString();


                // Actualizamos el saldo de la cuenta
                string Query1 = @"UPDATE dbo_Cat_Cuenta_Bancaria 
                                 SET Saldo = (Saldo @@Naturaleza @@ImporteRetiro)
                                 WHERE Id_Cuenta = @@IdCuenta
                                ";
                
                // Se registra el movimiento.
                Query1 = Query1.Replace("@@Naturaleza", Naturaleza.Equals("Entrada") ? "+" : "-");
                Query1 = Query1.Replace("@@ImporteRetiro", Importe);
                Query1 = Query1.Replace("@@IdCuenta", IdCuenta);

                SrvDB.ExecuteQuery_Update(Query1);
                
                string Query = @"INSERT INTO dbo_Trans_Movimiento_Bancario
                                (
                                    Id_Movimiento_Bancario,
                                    RFC,
                                    Secuencia,
                                    Estatus,
                                    Fecha_Movimiento_Bancario,
                                    Id_Cuenta,
                                    Id_TipoMov_Banco,
                                    Concepto,
                                    Referencia,
                                    Id_Moneda,
                                    Importe,
                                    UserHostAddress,
                                    Fecha_Alta,
                                    Usuario_Alta,
                                    Fecha_Mantto,
                                    Usuario_Mantto
                                )
                                VALUES
                                (
                                    IIF(DCount('*', 'dbo_Trans_Movimiento_Bancario') = 0, 1, DMax('Id_Movimiento_Bancario', 'dbo_Trans_Movimiento_Bancario') + 1),
                                    '@@RFC',
                                    IIF(DCount('*', 'dbo_Trans_Movimiento_Bancario', ""RFC = '@@RFC'"") = 0, 1, DMax('Id_Movimiento_Bancario', 'dbo_Trans_Movimiento_Bancario', ""RFC = '@@RFC'"") + 1),
                                    @@Estatus,
                                    '@@Fecha',                                
                                    @@IdCuenta,
                                    @@TipoMovBanco,
                                    '@@Concepto',
                                    '@@Referencia',
                                    @@IdMoneda,
                                    @@Importe,
                                    @@IdMoneda,
                                    NOW(),
                                    '@@Usuario_Alta',
                                    NOW(),
                                    '@@Usuario_Mantto'
                                )";

                Query = Query.Replace("@@RFC", this._RFC);
                Query = Query.Replace("@@Usuario_Alta", this._Usuario);
                Query = Query.Replace("@@Usuario_Mantto", this._Usuario);

                Query = Query.Replace("@@Fecha", Fecha.ToString());
                Query = Query.Replace("@@Estatus", SIIE_ERP.BaseDatos.EstatusDocs_Id.Estatus_Doc_Cargado.GetHashCode().ToString());

                Query = Query.Replace("@@IdCuenta", IdCuenta);
                Query = Query.Replace("@@IdMoneda", IdMoneda);
                Query = Query.Replace("@@TipoMovBanco", TipoMovimiento);

                Query = Query.Replace("@@Concepto", Concepto);
                Query = Query.Replace("@@Referencia", Referencia);

                Query = Query.Replace("@@IdMoneda", IdMoneda);
                Query = Query.Replace("@@Importe", Importe);
                
                return SrvDB.ExecuteQuery_Update(Query);
            }
            catch (Exception Ex)
            {
                return new Respuesta(2, Ex.Message);
            }
        }

        #endregion


    }
}
